﻿// 901 单词接龙.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>

using namespace std;

/*
http://oj.daimayuan.top/course/14/problem/765

有一群小伙伴在玩单词接龙游戏，每次新接上去的单词的第一个字母和前一个单词的最后一个字母需要相同。

现在给你一个含有 n个单词的词库，问你能否将这些单词全部都接起来（每个单词都被且仅被用到一次）？

每个单词 si都由小写字母构成，且长度不超过 10。

如果可以输出 Yes，否则输出 No。

输入格式
第一行一个整数 n。

接下来 n行，每行一个字符串 si。

输出格式
输出一行一个字符串。

样例输入
4
apple
wowo
emplace
endow
样例输出
Yes
数据规模
对于所有数据，保证 2≤n≤100000,2≤|si|≤10。
*/

vector<int> edges[27];
int f[27], c[100001],ind[27],outd[27];
int n, m,l;

void dfs(int x) {
	int len = edges[x].size();
	while (f[x] < len) {
		int y = edges[x][f[x]];
		++f[x];
		dfs(y);
		c[++l] = y;
	}
}

void Euler() {
	int x = 0, y = 0, z = 0;
	for (int i = 1; i <= n; i++) {
		if (outd[i] == ind[i] + 1) {
			y++, x = i;
		}
		if (outd[i] != ind[i])
			++z;
	}
	if (!(!z || (y == 1 && z == 2))) {
		printf("No\n");
		return;
	}

	if(!x){
		for (int i = 1; i <= n; i++) {
			if (ind[i])
				x = i;
		}
	}

	memset(f, 0, sizeof f);
	l = 0;
	dfs(x);
	c[++l] = x;
	if (l == m + 1)
		printf("Yes\n");
	else
		printf("No\n");
	//for (int i = l; i; --i)
		//printf("%d ",c[i]);
}

int main()
{
	n = 26;
	scanf("%d",&m);
	for (int i = 1; i <= m; i++) {
		char str[101];
		scanf("%s",str);
		int x = str[0] - 'a' + 1, y = str[strlen(str) - 1] - 'a' + 1;
		edges[x].push_back(y);
		++outd[x]; ++ind[y];
	}
	Euler();

	return 0;
}

 